iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
Modern Web

使用 Clojure 當個 Full-stack 開發者系列 第 12

[Day 12] `->` REPL 的開發體驗

  • 分享至 

  • xImage
  •  

來做個簡單的登入系統吧

一樣回歸最基本的功能,http form submit 然後使用Post redirect get的方式導頁

然後明天來檢查user到底有沒有在的處理,今天是PRG跟如何debug,參考day 12

再login.clj就只有一個login_handler

我先將程式簡化

(defn login_handler [req]
  ;; For demo how to debug ~~~
  (def req req)
  (prn (:params req))
  (m/match
   req
    {:request-method :post :params {:_action "login"}}
    (rr/redirect (-> (:reitit.core/router req)
                       (r/match-by-name :hello.you)
                       r/match->path))
    :else
    {:status 200
     :headers {"Content-Type" "text/html;charset=UTF-8"}
     :body "..."
     }))

handler下面直接多定義一個一樣的req

然後!!!!!

我們就可以在repl中開發看看要怎麼跳、要去哪裡,要怎麼取值(值真的有送的話)

程式邊寫,寫完evaluate,最終就跟我們怎麼進來的流程一樣,途中要驗證都不用切換瀏覽器、輸資料、送出

回到上面的程式

  • 你可以prn或是再更上面的comment裡直接執行看結果
  • 使用match pattern,我們針對有用的action做filter,畢竟form只有get/post
  • 最終redirect一個連結

這邊也帶出另一個很常用的macro ->

前面有提到,這個就是pipe,幫你把前面的值當下一個的第一個帶下去,所以還原就會變成

(-> (:reitit.core/router req)
   (r/match-by-name :hello.you)
   r/match->path)
(r/match->path (r/match-by-name (:reitit.core/router req) :hello.you))

好讀多了吧XDD

另外只有一個參數時,那個function的括弧是可選的

(-> (:reitit.core/router req)
   (r/match-by-name :hello.you)
   r/match->path)
(-> (:reitit.core/router req)
   (r/match-by-name :hello.you)
   (r/match->path))

上一篇
[Day 11] 堆積木之堆完
下一篇
[Day 13] 當Framework不再是你的庇護所
系列文
使用 Clojure 當個 Full-stack 開發者30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言